package com.linxuan.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.linxuan.reggie.common.BaseContext;
import com.linxuan.reggie.common.R;
import com.linxuan.reggie.entity.AddressBook;
import com.linxuan.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 地址簿控制层
 */
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController {

    @Autowired
    private AddressBookService addressBookService;


    /**
     * 新增地址簿信息
     *
     * @param addressBook 地址簿
     * @return 新增成功
     */
    @PostMapping
    public R<String> save(@RequestBody AddressBook addressBook) {
        // 前端传过来的数据中是没有userId的，所以我们需要设置一下
        addressBook.setUserId(BaseContext.getCurrentId());
        // 调用数据库保存
        addressBookService.save(addressBook);
        return R.success("保存成功");
    }

    /**
     * 查询登录系统用户的所有地址信息
     *
     * @return 地址簿信息
     */
    @GetMapping("/list")
    public R<List<AddressBook>> list() {
        // 获取到用户登录的ID
        Long userId = BaseContext.getCurrentId();
        // 设置查询条件
        LambdaQueryWrapper<AddressBook> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(userId != null, AddressBook::getUserId, userId);
        lambdaQueryWrapper.orderByDesc(AddressBook::getUpdateTime);

        // 返回查询出来的地址簿。select * from address_book where user_id = ? order by update_time desc
        return R.success(addressBookService.list(lambdaQueryWrapper));
    }

    /**
     * 设置默认地址操作
     *
     * @param addressBook 存储前端传过来的地址簿ID
     * @return 返回设置成功
     */
    @PutMapping("/default")
    public R<String> setDefault(@RequestBody AddressBook addressBook) {

        // 获取登录当前系统的用户ID
        Long userId = BaseContext.getCurrentId();

        // 构造修改条件构造器，注意这里使用的是LambdaUpdateWrapper
        LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
        // 首先将该用户所有的地址簿信息中的is_default修改为0
        wrapper.eq(AddressBook::getUserId, userId);
        wrapper.set(AddressBook::getIsDefault, 0);
        // SQL语句为：update address_book set is_default = 0 where user_id = ?;
        addressBookService.update(wrapper);

        // 设置该条地址信息的默认值为1
        addressBook.setIsDefault(1);
        // SQL语句为：update address_book set is_default = 1 where id = ?
        addressBookService.updateById(addressBook);
        return R.success("设置成功");
    }

    /**
     * 根据地址簿ID查询地址簿信息回显至前端
     *
     * @param id 前端传送过来的地址簿ID
     * @Return 返回查询出来的地址簿信息
     */
    @GetMapping("/{id}")
    public R<AddressBook> get(@PathVariable String id) {
        // 根据地址簿ID查询地址簿信息
        AddressBook addressBook = addressBookService.getById(id);
        if (addressBook != null) {
            return R.success(addressBook);
        }
        return R.error("查询失败");
    }

    /**
     * 修改某个地址的地址簿信息
     *
     * @param addressBook 前端传送过来需要修改为的地址簿信息
     * @return 返回是否修改成功
     */
    @PutMapping
    public R<String> updateAddressBook(@RequestBody AddressBook addressBook) {

        if (addressBookService.updateById(addressBook)) {
            return R.success("修改成功");
        }
        return R.error("修改失败");
    }

    /**
     * 根据地址簿ID删除地址簿信息
     *
     * @param id 前端传过来的地址簿ID，但是前端名称为ids，所以使用@RequestParam与之对应
     * @return 返回是否删除成功信息
     */
    @DeleteMapping
    public R<String> deleteAddressBook(@RequestParam("ids") String id) {
        if (addressBookService.removeById(id)) {
            return R.success("删除成功");
        }
        return R.error("删除失败");
    }

    /**
     * 查询当前前台登录用户的默认地址簿信息并返回
     * @return 返回查询到的默认地址簿信息
     */
    @GetMapping("/default")
    public R<AddressBook> getDefaultAddressBook() {
        // 获取当前登录用户ID
        Long userId = BaseContext.getCurrentId();
        LambdaQueryWrapper<AddressBook> addressBookLambdaQueryWrapper = new LambdaQueryWrapper<>();
        addressBookLambdaQueryWrapper.eq(userId != null, AddressBook::getUserId, userId);
        addressBookLambdaQueryWrapper.eq(AddressBook::getIsDefault, 1);

        AddressBook addressBook = addressBookService.getOne(addressBookLambdaQueryWrapper);
        if (addressBook != null) {
            return R.success(addressBook);
        }
        return R.error("查询失败");
    }
}
